package com.taijihuabao.common.interceptor;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author changhui.tu
 */
@Component
public class CrosFilter implements Filter {


    /**
     * 过滤器初始化，先执行且执行一次
     *
     * @param filterConfig
     */
    @Override
    public void init(FilterConfig filterConfig) {
    }

    /**
     * 过滤方法，每次请求响应都经过
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        response.setHeader("Access-Control-Allow-Origin", "*");
        //当判定为预检请求后，设定允许请求的方法
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        //当判定为预检请求后，设定允许请求的头部类型
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, token,Authorization");
        // 预检有效保持时间
        response.addHeader("Access-Control-Max-Age", "1");
        //一次非简单请求，会被过滤两次，即请求两次，第一次请求确认是否符合跨域要求（预检），这一次是不带headers的自定义信息，第二次请求会携带自定义信息。
        //这里通过判断请求的方法，判断此次是否是预检请求，如果是，立即返回一个204状态吗，标示，允许跨域；预检后，正式请求，这个方法参数就是我们设置的post了
        String returnOptions = "OPTIONS";
        if (returnOptions.equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * 销毁，doFilter执行完毕之后执行，且只有一次
     */
    @Override
    public void destroy() {
    }

}
